home *** CD-ROM | disk | FTP | other *** search
/ FishMarket 1.0 / FishMarket v1.0.iso / fishies / 351-375 / disk_360 / uucp / uucp0.lzh / src / lib / ndir.c < prev    next >
C/C++ Source or Header  |  1990-05-17  |  2KB  |  143 lines

  1.  
  2. /*
  3.  *  NDIR.C
  4.  *
  5.  *  Amiga (Lattice & Manx) "ndir" Library
  6.  */
  7.  
  8. #include <exec/types.h>
  9. #include <exec/memory.h>
  10. #include <libraries/dosextens.h>
  11.  
  12. #include <stdio.h>
  13. #include <stdlib.h>
  14. #include <string.h>
  15.  
  16. #include "ndir.h"
  17. #include "protos.h"
  18. #include "version.h"
  19.  
  20. IDENT(".01");
  21.  
  22. Prototype DIR *opendir(const char *);
  23. Prototype void rewinddir(DIR *);
  24. Prototype struct direct *readdir(DIR *);
  25. Prototype void closedir(DIR *);
  26.  
  27. /*
  28.  * open a directory.
  29.  */
  30.  
  31. DIR *
  32. opendir(const char *name)
  33. {
  34.     register DIR *dirp;
  35.     BPTR lock;
  36.  
  37. #ifdef TEST
  38.     fprintf(stderr, "opendir: Opening \"%s\"\n", name);
  39. #endif
  40.     if ((lock = Lock(name, (long)ACCESS_READ)) == NULL) {
  41. #ifdef TEST
  42.     fprintf(stderr, "opendir: Can't open.\n");
  43. #endif
  44.     return NULL;
  45.     }
  46.     if ((dirp = (DIR *)malloc(sizeof(DIR))) == NULL) {
  47. #ifdef TEST
  48.     fprintf(stderr, "opendir: couldn't malloc %d\n", sizeof(DIR));
  49. #endif
  50.     UnLock(lock);
  51.     return NULL;
  52.     }
  53. #ifdef TEST
  54.     fprintf(stderr, "FIB location is 0%lo\n", &dirp->fib);
  55. #endif
  56.     if (!Examine(lock, &dirp->fib)) {
  57. #ifdef TEST
  58.      fprintf(stderr, "opendir: Couldn't Examine directory\n");
  59. #endif
  60.      free(dirp);
  61.      UnLock(lock);
  62.     }
  63.     dirp->lock = (long)lock;
  64. #ifdef TEST
  65.     fputs("opendir: Sucessful\n", stderr);
  66. #endif
  67.     return dirp;
  68. }
  69.  
  70. /*
  71.  * go back to the begining of the directory
  72.  */
  73.  
  74. void
  75. rewinddir(DIR *dirp)
  76. {
  77.     Examine((BPTR)dirp->lock, &dirp->fib);
  78. }
  79.  
  80. /*
  81.  * get next entry in a directory.
  82.  */
  83.  
  84. struct direct *
  85. readdir(DIR *dirp)
  86. {
  87.     static struct direct dir;
  88.  
  89.     while (ExNext((BPTR)dirp->lock, &dirp->fib)) {
  90.     if (dirp->fib.fib_DirEntryType <= 0) {
  91.         dir.d_ino = dirp->fib.fib_DiskKey;
  92.         strcpy(dir.d_name, dirp->fib.fib_FileName);
  93. #ifdef TEST
  94.         fprintf(stderr, "readdir: OK \"%s\"\n",  dir.d_name);
  95. #endif
  96.         dir.d_namlen = strlen(dir.d_name);
  97.         dir.d_reclen = DIRSIZ(&dir);
  98.         return &dir;
  99.     }
  100.     }
  101. #ifdef TEST
  102.     fprintf(stderr, "readdir: No More Entries.\n");
  103. #endif
  104.     dir.d_name[0] = '\0';
  105.     return NULL;
  106. }
  107.  
  108. /*
  109.  * close a directory.
  110.  */
  111.  
  112. void
  113. closedir(DIR *dirp)
  114. {
  115.     UnLock((BPTR)dirp->lock);
  116.     free((char *)dirp);
  117. }
  118.  
  119. #ifdef TEST
  120.  
  121. main(void)
  122. {
  123.     char command[100];
  124.  
  125.     DIR *dirp;
  126.     struct direct *dp;
  127.  
  128.     while(gets(command) != NULL) {
  129.     fprintf(stderr, "test: %s\n", command);
  130.     if ((dirp = opendir(command)) == NULL) {
  131.         fprintf(stderr, "couldn't open dir %s\n", command);
  132.     } else {
  133.         while ((dp = readdir(dirp)) != NULL)
  134.         fprintf(stderr, "%s\n", dp->d_name);
  135.         closedir(dirp);
  136.     }
  137.     }
  138.     return 0;
  139. }
  140.  
  141. #endif
  142.  
  143.